<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 为了解决原型链继承  子类继承下来的属性和方法不在自己身上  
        // 于是有了借用构造函数继承 

        // 借用构造函数继承 / call继承  / 借用继承 

        // 核心:
        //     核心把父类构造函数 当成普通函数调用  利用call 改变this指向

        // 优点:
        //      把属性继承在了自己身上  

        // 缺点: 
        //      只能继承父类的属性  不能继承父类的方法  

        function Person(name,age){
            this.name = name;
            this.age = age;  // 因为 Student中 使用了  Person.call(this);
            // 所以 Person的this 变成 Student的实例 

        }

        Person.prototype.sayHello = function(){
            console.log('hello world');
        }


        function Student(gender,...arg){
            // ... 合并功能  接收除了gender外的所有的形参
            this.gender = gender;
            // Student 构造函数内部  this 代表 当前创造的Student实例
            Person.call(this,...arg); // 把父类的构造函数当成普通函数调用 
            // call 第一参数  this指向谁  从第二个参数开始依次给函数形参赋值 
            // ...arg 展开功能 依次给Person的形参赋值  

        }

        const s = new Student('女','张三',20);
        console.log(s);
        console.log(s.name);
        console.log(s.age);
        s.sayHello();// 报错  因为 s 使用借用构造函数继承  不能继承父类的方法  

        



    </script>
</body>
</html>